//------------------------------------------------------------------------------
/*
    This file is part of rippled: https://github.com/ripple/rippled
    Copyright (c) 2012, 2013 Ripple Labs Inc.

    Permission to use, copy, modify, and/or distribute this software for any
    purpose  with  or without fee is hereby granted, provided that the above
    copyright notice and this permission notice appear in all copies.

    THE  SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    WITH  REGARD  TO  THIS  SOFTWARE  INCLUDING  ALL  IMPLIED  WARRANTIES  OF
    MERCHANTABILITY  AND  FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    ANY  SPECIAL ,  DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    WHATSOEVER  RESULTING  FROM  LOSS  OF USE, DATA OR PROFITS, WHETHER IN AN
    ACTION  OF  CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
//==============================================================================

#include "ledger/AccountEntry.h"
#include "ledger/TrustLine.h"
#include "ledger/OfferEntry.h"

namespace ripple {

// Transaction database holds transactions and public keys
const char* TxnDBInit[] =
{
    "PRAGMA synchronous=NORMAL;",
    "PRAGMA journal_mode=WAL;",
    "PRAGMA journal_size_limit=1582080;",

#if (ULONG_MAX > UINT_MAX) && !defined (NO_SQLITE_MMAP)
	"PRAGMA mmap_size=17179869184;",
#endif

    "BEGIN TRANSACTION;",

    "CREATE TABLE IF NOT EXISTS Transactions (				\
		TransID		CHARACTER(64) ,      \
		TransType	CHARACTER(24),       \
		FromAcct	CHARACTER(35),       \
		FromSeq		BIGINT UNSIGNED,     \
		LedgerSeq	BIGINT UNSIGNED,     \
		Status		CHARACTER(1),        \
		RawTxn		BLOB,                \
		TxnMeta		BLOB,                \
        PRIMARY KEY (TransID, LedgerSeq) \
	);",
    "CREATE INDEX IF NOT EXISTS TransIDIndex ON                 \
		Transactions(TransID);",

    "CREATE INDEX IF NOT EXISTS TxLgrIndex ON                 \
		Transactions(LedgerSeq);",

    "CREATE TABLE IF NOT EXISTS AccountTransactions (			\
		TransID		CHARACTER(64),				\
		Account		CHARACTER(64),				\
		LedgerSeq	BIGINT UNSIGNED,			\
		TxnSeq		INTEGER						\
	);",
    "CREATE INDEX IF NOT EXISTS AcctTxIDIndex ON				\
		AccountTransactions(TransID);",
    "CREATE INDEX IF NOT EXISTS AcctTxIndex ON				\
		AccountTransactions(Account, LedgerSeq, TxnSeq, TransID);",
    "CREATE INDEX IF NOT EXISTS AcctLgrIndex ON				\
		AccountTransactions(LedgerSeq, Account, TransID);",

    "END TRANSACTION;"
};

int TxnDBCount = NUMBER (TxnDBInit);

// Ledger database holds ledgers and ledger confirmations
const char* LedgerDBInit[] =
{
    "PRAGMA synchronous=NORMAL;",
    "PRAGMA journal_mode=WAL;",
    "PRAGMA journal_size_limit=1582080;",

    "BEGIN TRANSACTION;",

    "CREATE TABLE IF NOT EXISTS Ledgers (							\
		LedgerHash		CHARACTER(64) PRIMARY KEY,	\
		LedgerSeq		BIGINT UNSIGNED,			\
		PrevHash		CHARACTER(64),				\
		TotalCoins		BIGINT UNSIGNED,			\
		InflateSeq		BIGINT UNSIGNED,			\
		FeePool			BIGINT UNSIGNED,			\
		ClosingTime		BIGINT UNSIGNED,			\
		PrevClosingTime	BIGINT UNSIGNED,			\
		CloseTimeRes	BIGINT UNSIGNED,			\
		CloseFlags		BIGINT UNSIGNED,			\
		AccountSetHash	CHARACTER(64),				\
		TransSetHash	CHARACTER(64)				\
	);",
    "CREATE INDEX IF NOT EXISTS SeqLedger ON Ledgers(LedgerSeq);",

    "CREATE TABLE IF NOT EXISTS Validations	(					\
		LedgerHash	CHARACTER(64),					\
		NodePubKey	CHARACTER(56),					\
		SignTime	BIGINT UNSIGNED,				\
		RawData		BLOB							\
	);",
    "CREATE INDEX IF NOT EXISTS ValidationsByHash ON				\
		Validations(LedgerHash);",
    "CREATE INDEX IF NOT EXISTS ValidationsByTime ON				\
		Validations(SignTime);",


    "END TRANSACTION;"
};

int LedgerDBCount = NUMBER (LedgerDBInit);

// RPC database holds persistent data for RPC clients.
const char* RpcDBInit[] =
{

    // Local persistence of the RPC client
    "CREATE TABLE IF NOT EXISTS RPCData (							\
		Key			TEXT PRIMARY Key,				\
		Value		TEXT							\
	);",
};

int RpcDBCount = NUMBER (RpcDBInit);

// NodeIdentity database holds local accounts and trusted nodes
// VFALCO NOTE but its a table not a database, so...?
//
const char* WalletDBInit[] =
{
    // Node identity must be persisted for CAS routing and responsibilities.
    "BEGIN TRANSACTION;",

    "CREATE TABLE IF NOT EXISTS NodeIdentity (					\
		PublicKey		CHARACTER(53),				\
		PrivateKey		CHARACTER(52),				\
		Dh512			TEXT,						\
		Dh1024			TEXT						\
	);",

    // Miscellaneous persistent information
    // Integer: 1 : Used to simplify SQL.
    // ScoreUpdated: when scores was last updated.
    // FetchUpdated: when last fetch succeeded.
    "CREATE TABLE IF NOT EXISTS Misc (							\
		Magic			INTEGER UNIQUE NOT NULL,	\
		ScoreUpdated	DATETIME,					\
		FetchUpdated	DATETIME					\
	);",

    // Scoring and other information for domains.
    //
    // Domain:
    //  Domain source for https.
    // PublicKey:
    //  Set if ever succeeded.
    // XXX Use NULL in place of ""
    // Source:
    //  'M' = Manually added.   : 1500
    //  'V' = validators.txt    : 1000
    //  'W' = Web browsing.     :  200
    //  'R' = Referral          :    0
    // Next:
    //  Time of next fetch attempt.
    // Scan:
    //  Time of last fetch attempt.
    // Fetch:
    //  Time of last successful fetch.
    // Sha256:
    //  Checksum of last fetch.
    // Comment:
    //  User supplied comment.
    // Table of Domains user has asked to trust.
    "CREATE TABLE IF NOT EXISTS SeedDomains (						\
		Domain			TEXT PRIMARY KEY NOT NULL,	\
		PublicKey		CHARACTER(53),				\
		Source			CHARACTER(1) NOT NULL,		\
		Next			DATETIME,					\
		Scan			DATETIME,					\
		Fetch			DATETIME,					\
		Sha256			CHARACTER[64],				\
		Comment			TEXT						\
	);",

    // Allow us to easily find the next SeedDomain to fetch.
    "CREATE INDEX IF NOT EXISTS SeedDomainNext ON SeedDomains (Next);",

    // Table of PublicKeys user has asked to trust.
    // Fetches are made to the CAS.  This gets the ripple.txt so even validators
    // without a web server can publish a ripple.txt.
    // Source:
    //  'M' = Manually added.   : 1500
    //  'V' = validators.txt    : 1000
    //  'W' = Web browsing.     :  200
    //  'R' = Referral          :    0
    // Next:
    //  Time of next fetch attempt.
    // Scan:
    //  Time of last fetch attempt.
    // Fetch:
    //  Time of last successful fetch.
    // Sha256:
    //  Checksum of last fetch.
    // Comment:
    //  User supplied comment.
    "CREATE TABLE IF NOT EXISTS SeedNodes (						\
		PublicKey		CHARACTER(53) PRIMARY KEY NOT NULL,		\
		Source			CHARACTER(1) NOT NULL,		\
		Next			DATETIME,					\
		Scan			DATETIME,					\
		Fetch			DATETIME,					\
		Sha256			CHARACTER[64],				\
		Comment			TEXT						\
	);",

    // Allow us to easily find the next SeedNode to fetch.
    "CREATE INDEX IF NOT EXISTS SeedNodeNext ON SeedNodes (Next);",

    // Nodes we trust to not grossly collude against us.  Derived from
    // SeedDomains, SeedNodes, and ValidatorReferrals.
    //
    // Score:
    //  Computed trust score.  Higher is better.
    // Seen:
    //  Last validation received.
    "CREATE TABLE IF NOT EXISTS TrustedNodes (							\
		PublicKey		CHARACTER(53) PRIMARY KEY NOT NULL,	\
		Score			INTEGER DEFAULT 0 NOT NULL,			\
		Seen			DATETIME,							\
		Comment			TEXT								\
	);",

    // List of referrals.
    // - There may be multiple sources for a Validator. The last source is used.
    // Validator:
    //  Public key of referrer.
    // Entry:
    //  Entry index in [validators] table.
    // Referral:
    //  This is the form provided by the ripple.txt:
    //  - Public key for CAS based referral.
    //  - Domain for domain based referral.
    // XXX Do garbage collection when validators have no references.
    "CREATE TABLE IF NOT EXISTS ValidatorReferrals (				\
		Validator		CHARACTER(53) NOT NULL,		\
		Entry			INTEGER NOT NULL,			\
		Referral		TEXT NOT NULL,				\
		PRIMARY KEY (Validator,Entry)				\
	);",

    // List of referrals from ripple.txt files.
    // Validator:
    //  Public key of referree.
    // Entry:
    //  Entry index in [validators] table.
    // IP:
    //  IP of referred.
    // Port:
    //  -1 = Default
    // XXX Do garbage collection when ips have no references.
    "CREATE TABLE IF NOT EXISTS IpReferrals (							\
		Validator		CHARACTER(53) NOT NULL,			\
		Entry			INTEGER NOT NULL,				\
		IP				TEXT NOT NULL,					\
		Port			INTEGER NOT NULL DEFAULT -1,	\
		PRIMARY KEY (Validator,Entry)					\
	);",

    "CREATE TABLE IF NOT EXISTS Features (							\
		Hash			CHARACTER(64) PRIMARY KEY,		\
		FirstMajority	BIGINT UNSIGNED,				\
		LastMajority	BIGINT UNSIGNED					\
	);",

    "END TRANSACTION;"
};

int WalletDBCount = NUMBER (WalletDBInit);

// Hash node database holds nodes indexed by hash
// VFALCO TODO Remove this since it looks unused
/*

int HashNodeDBCount = NUMBER (HashNodeDBInit);
*/

// Net node database holds nodes seen on the network
// XXX Not really used needs replacement.
/*
const char* NetNodeDBInit[] =
{
    "CREATE TABLE IF NOT EXISTS KnownNodes	(					\
		Hanko			CHARACTER(35) PRIMARY KEY,	\
		LastSeen		TEXT,						\
		HaveContactInfo	CHARACTER(1),				\
		ContactObject	BLOB						\
	);"
};

int NetNodeDBCount = NUMBER (NetNodeDBInit);
*/



} // ripple
